配置 cpp 环境
前置概念
虽然早在大一就已经学习过 C 语言了,但是因为一直没有机会使用早就忘的差不多了,现在要开始复习数据结构和算法,然而大部分资料都是基于 C 语言写的(毕竟是大部分高级语言的爹),所以这里重新学习一下 C 语言,在接下来的数据结构和算法学习中,先使用 C 语言编写一遍再想办法移植到其它的高级语言上去,借此机会可以学习到更多的基础知识,以及高级语言的特性
#include <stdio.h>
int main()
{
printf("Hello, World! \n");
return 0;
}
在 GNU 工具集里面,开发时常见到的几个罗列如下
工具 | 说明 |
---|---|
gcc | GNU C 语言编译器。 |
g++ | GNU C++ 语言编译器。 |
ld | GNU 链接器,将目标文件和库文件链接起来,创建可执行程序和动态链接库。 |
ar | 生成静态库 .a ,可以编辑和管理静态链接库。 |
make | 生成器,可以根据 makefile 文件自动编译链接生成可执行程序或库文件。 |
gdb | 调试器,用于调试可执行程序。 |
ldd | 查看可执行文件依赖的共享库(扩展名 .so,也叫动态链接库)。 |
gcc:是GCC中的GUN C Compiler(C 编译器) g++:是GCC中的GUN C++ Compiler(C++编译器)
各种文件后缀
C++实现 | 源代码的扩展名 |
---|---|
UNIX | C、cc、cxx、c |
GNU C++ | C、cc、cxx、cpp、c++ |
Borland C++ | Cpp |
Microsoft Visual C++ | cpp、cxx、cc |
配置环境
如果是 Linux 环境则首先检查一下是否已经安装了 GNU 编译器
gcc -v
如果是 Windows 环境有 MinGW 和 MSVC 两种方案
- MSVC:Microsoft Visual C++ Compiler,即微软自己的编译器
- MinGW:GNU 在 Linux 下面鼎鼎大名的 gcc/g++,MinGW 则是指 Minimalist GNU for Windows 的缩写,它是一个可自由使用和自由发布的 Windows 特定头文件和使用 GNU 工具集导入库的集合,允许你在 GNU/Linux 和Windows平台生成本地的 Windows 程序而不需要第三方 C 运行时库。
因为 MSVC 需要下载 Build Tools for Visual Studio 包体有点大(巨硬安装 VS2019 的那个工具),所以这里使用 MinGW(因为都是 GCC 所以和 Linux 自带的命令一致)
首先下载 MinGW
然后把 bin 目录添加到环境变量里面去
Makefile 文件是什么?
Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
在 Windows 下作开发的话不需要去考虑这个问题,因为 Windows 下的集成开发环境(IDE)已经内置了 Makefile,或者说会自动生成 Makefile,我们不用去手动编写
以 Linux 下的 C语言开发为例来具体说明一下,多文件编译生成一个文件,编译的命令如下所示:
gcc -o outfile name1.c name2.c ...
outfile 要生成的可执行程序的名字,nameN.c 是源文件的名字。这是我们在 Linux 下使用 gcc 编译器编译 C 文件的例子。如果我们遇到的源文件的数量不是很多的话,可以选择这样的编译方式。如果源文件非常的多的话,就会遇到下面的这些问题。
1、编译的时候需要链接库的问题。拿C语言来说,编译的时候 gcc 只会默认链接一些基本的C语言标准库,很多源文件依赖的标准库都需要我们手动链接。
下面列举了一些需要我们手动链接的标准库: name1.c 用到了数学计算库 math 中的函数,我们得手动添加参数 -Im; name4.c 用到了小型数据库 SQLite 中的函数,我们得手动添加参数 -lsqlite3; name5.c 使用到了线程,我们需要去手动添加参数 -lpthread。
因为有很多的文件,还要去链接很多的第三方库。所以在编译的时候命令会很长,并且在编译的时候我们可能会涉及到文件链接的顺序问题,所以手动编译会很麻烦。
如果使用 Makefile 就不一样了,它会彻底简化编译的操作。把要链接的库文件放在 Makefile 中,制定相应的规则和对应的链接顺序。这样只需要执行 make 命令,工程就会自动编译。每次想要编译工程的时候就执行 make ,省略掉手动编译中的参数选项和命令,非常的方便。
cpp 项目的结构
- project
- .gitignore
- README.md
- LICENCE.md
- CMakeLists.txt
- cmake
- FindSomeLib.cmake
- something_else.cmake
- include
- project
- lib.hpp
- src
- CMakeLists.txt
- lib.cpp
- apps
- CMakeLists.txt
- app.cpp
- tests
- CMakeLists.txt
- testlib.cpp
- docs
- CMakeLists.txt
- extern
- googletest
- scripts
- helper.py